
// 已加入购物车的商品，格式如 [{ id, quantity }, { id, quantity }]
// 注意，购物车只存储 id 和数量，其他商品信息不存储
const state = {
  cartList: []
}

const getters = {
  // 获取购物车商品
  getCartList: (state, getters, rootState) => {
    // rootState - 全局 state
    // 购物车 items 只有 id  quantity ，没有其他商品信息。要从这里获取。
    return state.cartList.map(cartListItem => {
      // 找到对应的 productionItem
      const product = rootState.products.productsList.find(proItem =>(
        proItem.id === cartListItem.id
      ));
      // 返回商品信息，外加购物数量
      return {
        ...product,
        quantity: cartListItem.quantity
      };
      
    })
  },
  // 所有购物车商品的价格总和
  totalPrice: (state, getters) => {
    // reduce 的经典使用场景，求和
    return getters.getCartList.reduce((total, curItem) => {
      return total + curItem.quantity * curItem.price
    }, 0)
  }
}

// actions —— 异步操作要放在 actions
const actions = {
   // 添加到购物车
  // 【注意】这里没有异步，为何要用 actions ？？？—— 因为要整合多个 mutation
  //        mutation 是原子，其中不可再进行 commit ！！！
  
}

const mutations = {
  // 加入购物车
  addToCart(state, { id }) {
    // 先看购物车中是否有该商品
    const prd = state.cartList.find(item => item.id === id);
    if (prd) {
      // 数量加一
      prd.quantity++;
      return;
    }
    // 购物车没有该商品
    state.cartList.push({
      id,
      quantity: 1 // 默认购物数量 1
    });
  },
  // 从购物车删除一个（即购物数量减一）
  delFromCart(state, { id }) {
    // 从购物车中找出该商品
    const prd = state.cartList.find(item => item.id === id);
    if (prd == null) {
      return;
    }

    // 数量减一
    prd.quantity--;

    // 如果数量减少到了 0
    if (prd.quantity <= 0) {
      state.cartList = state.cartList.filter(item => item.id !== id);
    }
  }
}

export default {
  namespaced: true,   // 命名空间
  state,
  getters,
  actions,
  mutations
}